<?php
namespace App\Exceptions\Response;

use Exception;
use App\Core\Response\ResponseError;

/**
 * 自定义 Service 异常，及统一封装处理
 */
class ServiceException extends Exception
{

    /**
     * 业务逻辑错误
     */
    const SERVICE_ERROR = 44000;

    /* 其他错误 */
    /**
     * （参数错误）其他错误
     */
    const SERVICE_PARAM_INVALID = 44001;

    /**
     * （密码错误）其他错误
     */
    const SERVICE_PARAM_INVALID_PASSWORD = 44002;

    /**
     * （任务等待中）其他错误
     */
    const SERVICE_TASK_WAITING = 44003;

    /**
     * （时间范围错误）其他错误
     */
    const SERVICE_DATE_RANGE_ERROR = 44004;

    /**
     * （格式错误）其他错误
     */
    const SERVICE_PARAM_FORMAT = 44006;

    /**
     * （默认错误）Elasticsearch错误
     */
    const SERVICE_ELASTICSEARCH_ERROR = 44080;

    /**
     * （最大返回数据条数限制）Elasticsearch错误
     */
    const SERVICE_ELASTICSEARCH_MAX_RESULT_WINDOW = 44081;

    /* 不存在错误 */
    /**
     * （数据不存在）不存在错误
     */
    const SERVICE_NOT_EXIST_DATA = 44100;

    /**
     * （用户不存在）不存在错误
     */
    const SERVICE_NOT_EXIST_USER = 44101;

    /**
     * （邮箱不存在）不存在错误
     */
    const SERVICE_NOT_EXIST_EMAIL = 44102;

    /**
     * （平台人不存在）不存在错误
     */
    const SERVICE_NOT_EXIST_MEMBER = 44111;

    /**
     * （平台不存在）不存在错误
     */
    const SERVICE_NOT_EXIST_ORG = 44112;

    /**
     * （平台抽佣比例不存在）不存在错误
     */
    const SERVICE_NOT_EXIST_RATE = 44113;

    /**
     * （平台访问秘钥不存在）
     */
    const SERVICE_NOT_EXIST_ACCESS_KEY = 44114;

    /**
     * （平台支付类型不存在）
     */
    const SERVICE_NOT_EXIST_PLAT_PAYMENT = 44115;

    /**
     * （平台支持币种不存在）
     */
    const SERVICE_NOT_EXIST_PLAT_CURRENCY = 44116;

    /**
     * （游戏不存在）不存在错误
     */
    const SERVICE_NOT_EXIST_GAME = 44121;

    /**
     * （玩家不存在）不存在错误
     */
    const SERVICE_NOT_EXIST_PLAYER = 44122;

    /**
     * （数据库表不存在）不存在错误
     */
    const SERVICE_NOT_EXIST_TABLE = 44131;

    /**
     * （Elasticsearch不存在）不存在错误
     */
    const SERVICE_NOT_EXIST_ELASTICSEARCH = 44132;

    /* 存在错误 */
    /**
     * （数据已存在）存在错误
     */
    const SERVICE_EXISTED_DATA = 44200;

    /**
     * （用户已存在）存在错误
     */
    const SERVICE_EXISTED_USER = 44201;

    /**
     * （邮箱已存在）存在错误
     */
    const SERVICE_EXISTED_EMAIL = 44202;

    /**
     * （平台人已存在）存在错误
     */
    const SERVICE_EXISTED_MEMBER = 44211;

    /**
     * （账号已被平台人关联）存在错误
     */
    const SERVICE_EXISTED_MEMBER_RELATION_USER = 44212;

    /**
     * （组织存在子节点）存在错误
     */
    const SERVICE_EXISTED_ORG_CHILDREN = 44221;

    /* 操作错误 */
    /**
     * （保存失败）操作错误
     */
    const SERVICE_ACTION_SAVE_ERROR = 44300;

    /**
     * （禁止操作）操作错误
     */
    const SERVICE_ACTION_DISABLE = 44301;

    /* 禁用错误 */
    /**
     * （数据被禁用）禁用错误
     */
    const SERVICE_DISABLE_DATA = 44400;

    /**
     * （用户被禁用）禁用错误
     */
    const SERVICE_DISABLE_USER = 44401;

    /**
     * （平台人被禁用）禁用错误
     */
    const SERVICE_DISABLE_MEMBER = 44411;

    /**
     * （平台访问秘钥被禁用）
     */
    const SERVICE_DISABLE_ACCESS_KEY = 44412;

    /* 权限错误 */
    /**
     * （数据未授权）权限错误
     */
    const SERVICE_NOT_AUTH_DATA = 44500;

    /**
     * （用户未授权）权限错误
     */
    const SERVICE_NOT_AUTH_USER = 44501;

    /* 超级管理员 */
    /**
     * （超级管理员）超级管理员
     */
    const SERVICE_SUPER_ADMIN = 44700;

    /**
     * （没有权限管理该账号）超级管理员
     */
    const SERVICE_SUPER_ADMIN_AUTH = 44701;

    /* 筹码 */
    /**
     * （筹码）筹码
     */
    const SERVICE_COIN = 44800;

    /**
     * （筹码数量为空）筹码
     */
    const SERVICE_COIN_EMPTY = 44801;

    /**
     * （筹码数量不足）筹码
     */
    const SERVICE_COIN_LACK = 44802;

    /* 游戏服务错误 */
    /**
     * 游戏服务错误
     */
    const SERVICE_GAME_SERVICE = 44900;

    /**
     * 游戏服务token不存在
     */
    const SERVICE_GAME_SERVICE_NOT_EXIST_TOKEN = 44901;

    /**
     * 游戏服务内部错误
     */
    const SERVICE_GAME_SERVICE_SYSTEM_ERROR = 44902;

    /**
     * 游戏服务请求超时
     */
    const SERVICE_GAME_SERVICE_REQUEST_TIMEOUT = 44903;

    /* Api服务错误 */
    /**
     * Api服务错误
     */
    const SERVICE_API_SERVICE = 44920;

    /**
     * Api服务请求超时
     */
    const SERVICE_API_SERVICE_REQUEST_TIMEOUT = 44921;

    /**
     * 详细错误信息
     *
     * @var array
     */
    protected $errors = [];

    /**
     * 构造并初始化参数
     *
     * @param int|null $code
     * @param string|null $message
     * @param array $errors
     */
    public function __construct(?int $code = self::SERVICE_ERROR, ?string $message = '', array $errors = [])
    {
        $code = $code ?? self::SERVICE_ERROR;

        $message = $message ?: trans('exception.service.' . $code);

        parent::__construct($message, $code);

        $this->setErrors($errors);
    }

    /**
     * 设置详细错误信息
     *
     * @param array $errors
     * @return $this
     */
    public function setErrors(array $errors)
    {
        $this->errors = $errors;

        return $this;
    }

    /**
     * 获取详细错误信息
     *
     * @param array $errors
     * @return array
     */
    public function getErrors()
    {
        return $this->errors;
    }

    /**
     * 记录异常日志
     *
     * @return void
     */
    public function report()
    {
        //
    }

    /**
     * 将异常渲染到 HTTP 响应中
     *
     * @param \Illuminate\Http\Request $request
     * @return \App\Core\Response\ResponseError
     */
    public function render($request)
    {
        return new ResponseError($this->getCode(), $this->getMessage(), $this->getErrors());
    }
}
